package nucleo;

import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics2D;
import java.io.*;
import java.util.HashMap;

/**
 *
 * @author OsomGames
 * @date 18-07-2011
 */
public class Zona {

    private final int TOTAL_FILAS = 9;
    private final int TOTAL_COLUMNAS = 40;
    private char[][] zona = new char[TOTAL_FILAS][TOTAL_COLUMNAS];
    private HashMap<String, Bloque> bloques = new HashMap<String, Bloque>();
    private HashMap<String, Personaje> coleccionPersonajes = new HashMap<String, Personaje>();
    

    /**
     * Crea un archivo con la zona en un array String
     * @param zona
     * @param fichero 
     */
    public void crearZona(String[] zona, String fichero) {
        try {
            // Crea el archivo
            FileWriter fstream = new FileWriter(fichero);
            // Abre el buffer para escribir
            BufferedWriter out = new BufferedWriter(fstream);
            // Escribe el nivel
            for (int i = 0; i <= zona.length - 1; i++) {
                out.write(zona[i] + "\n");
            }
            // Cierra el buffer
            out.close();
        } catch (Exception e) {
            System.err.println("Error al crear: " + e.getMessage());
        }
    }

    /**
     * Carga la Zona especificada por el fichero
     * @param fichero 
     */
    public void cargarZona(String fichero) {

        try {
            // Leemos el archivo    
            FileReader fstream = new FileReader(new File(fichero));

            // Abrimos el buffer de lectura
            BufferedReader in = new BufferedReader(fstream);

            // Recorremos cada linea, introduciendo cada caracter en una matriz
            zona[0] = in.readLine().toCharArray();
            System.out.println(zona[0]);
            zona[1] = in.readLine().toCharArray();
            System.out.println(zona[1]);
            zona[2] = in.readLine().toCharArray();
            System.out.println(zona[2]);
            zona[3] = in.readLine().toCharArray();
            System.out.println(zona[3]);
            zona[4] = in.readLine().toCharArray();
            System.out.println(zona[4]);
            zona[5] = in.readLine().toCharArray();
            System.out.println(zona[5]);
            zona[6] = in.readLine().toCharArray();
            System.out.println(zona[6]);
            zona[7] = in.readLine().toCharArray();
            System.out.println(zona[7]);
            zona[8] = in.readLine().toCharArray();
            System.out.println(zona[8]);

            // Cerramos el buffer y el archivo
            in.close();
            fstream.close();

            // Y a continuacion cargamos los bloques en su array
            cargarBloques();

        } catch (Exception e) {
            System.err.println("Error al cargar: " + e.getMessage());
        }
    }
    /**
     * El metodo para pintar los bloques y los personajes
     * @param g
     * @param a 
     */
    public void pintarZona(Graphics2D g, Applet a) {
        for (Bloque b : bloques.values()) {
            g.setColor(Color.black);
            g.fill(b.getBounds());
        }

        if (this.coleccionPersonajes.containsKey("Jugador")) {
            coleccionPersonajes.get("Jugador").pintarPersonaje(g, a);
        }

    }

    /**
     * Metodo usado para añadir un personaje a la zona
     * @param s - Nombre de la clave
     * @param p - Objeto personaje
     */
    protected void añadirPersonaje(String s, Personaje p) {
        coleccionPersonajes.put(s, p);
    }
    /**
     * Durante la carga de la Zona, se cargan ademas
     * todos los bloques, con su respectiva clave posicion
     * y el bloque en si
     */
    private void cargarBloques() {
        String cadena = "";
        for (int i = 0; i < TOTAL_FILAS; i++) {
            for (int j = 0; j < TOTAL_COLUMNAS; j++) {
                if (zona[i][j] == 'B') {
                    cadena += j+","+i;
                    
                    bloques.put(cadena, new Bloque(j * 50, i * 50, 50, 50));
                    System.out.println(i + "," + j + " Bloque B");
                    cadena = "";
                } else if (zona[i][j] == 'A') {
                    cadena += j+","+i;
                    bloques.put(cadena, new Bloque(j * 50, i * 50, 50, 50));
                    cadena = "";
                    System.out.println(i + "," + j + " Bloque A");
                } 
            }
        }
    }

    /**
     * Esta funcion es la que ubica y dimensiona los bloques obtenidos
     * @param x = Posicion X
     * @param y = Posicion Y
     */
    public Bloque getBloque(int x, int y) {
        String cadena = y+","+x;
        return bloques.get(cadena);
    }
}
